10025. Задача ?
1 ? 2 ? … ? n = k
Имеется формула ? 1 ? 2 ? … ? n = k.
Вместо знаков ‘?’ ставятся ‘+’ или ‘-‘ так, чтобы получить верное равенство.
Для заданного k найти минимальное n, для которого существует указанная
формула. Например, для k = 12 ответом
будет n = 7, так как - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12.
Вход.
Первая строка содержит количество тестов, за которой следует пустая строка.
Каждая следующая строка содержит целое число k (0 £ |k| £ 109). Входные тесты
разделены пустой строкой.
Выход. Для каждого теста вывести
минимальное n (1 £ n), для которого существует формула, из
которой можно получить k. Вывод
результатов для последовательных тестов разделять пустой строкой.
2
12
-3646397
Пример выхода
7
2701
математика
Положим
k = |k|, после чего k станет
положительным. Ищем минимальное n,
для которого 1 + 2 + … + n ³ k. Решим уравнение (1 + n)
* n / 2 = k относительно n. После
преобразований получим: n2
+ n – 2k = 0, дискриминант D = 1 + 8k,
положительный корень уравнения равен
n1 =
Ответом
будет такое n Î {n1,
n1 + 1, n1 + 2}, для которого
четность суммы 1 + 2 + … + n и
четность k совпадают. Отдельно
следует обработать случай k = 0:
поскольку если 1 + 2 – 3 = 0, то ответом будет 3.
Читаем количество тестов tests.
scanf("%d",&tests);
while(tests--)
{
Для каждого теста вводим значение
k и находим его модуль.
scanf("%d",&k); k =
abs(k);
Отдельно обрабатываем случай k = 0.
if (!k)
printf("3\n");
else
{
Находим положительный корень n квадратного уравнения, приведенного
выше. Увеличиваем n на 1 до тех пор,
пока сумма 1 + 2 + … + n = и значение k не будут иметь одинаковую четность.
n = (int)(ceil((-1
+ sqrt(1 + 8.0 * k)) / 2) + 0.1);
while(((1 + n) * n / 2 - k) % 2 == 1)
n++;
Выводим результат. Если тест не
последний, выводим после ответа на него пустую строку.
printf("%d\n",n);
}
if (tests)
printf("\n");
}